NOTE
This appendix consists of a cross-reference listing generated by the XREF utility from the results of assembly with MAC. The original source file used to generate this listing is available here.
1 ; MDS-800 I/O DRIVERS FOR CP/M 2.2 2 ; (FOUR DRIVE SINGLE DENSITY VERSION) 3 ; 4 ; VERSION 2.2 FEBRUARY, 1980 5 ; 6 0016 = VERS EQU 22 ;VERSION 2.2 7 ; 8 ; COPYRIGHT (C) 1980 9 ; DIGITAL RESEARCH 10 ; BOX 579, PACIFIC GROVE 11 ; CALIFORNIA, 93950 12 ; 13 ; 14 FFFF = TRUE EQU 0FFFFH ;VALUE OF "TRUE" 15 0000 = FALSE EQU NOT TRUE ;"FALSE" 16 0000 = TEST EQU FALSE ;TRUE IF TEST BIOS 17 ; 18 IF TEST 19 BIAS EQU 03400H ;BASE OF CCP IN TEST SYSTEM 20 ENDIF 21 IF NOT TEST 22 0000 = BIAS EQU 0000H ;GENERATE RELOCATABLE CP/M SYSTEM 23 ENDIF 24 ; 25 1600 = PATCH EQU 1600H 26 ; 27 1600 ORG PATCH 28 0000 = CPMB EQU $-PATCH ;BASE OF CPM CONSOLE PROCESSOR 29 0806 = BDOS EQU 806H+CPMB ;BASIC DOS (RESIDENT PORTION) 30 1600 = CPML EQU $-CPMB ;LENGTH (IN BYTES) OF CPM SYSTEM 31 002C = NSECTS EQU CPML/128 ;NUMBER OF SECTORS TO LOAD 32 0002 = OFFSET EQU 2 ;NUMBER OF DISK TRACKS USED BY CP/M 33 0004 = CDISK EQU 0004H ;ADDRESS OF LAST LOGGED DISK ON WARM START 34 0080 = BUFF EQU 0080H ;DEFAULT BUFFER ADDRESS 35 000A = RETRY EQU 10 ;MAX RETRIES ON DISK I/O BEFORE ERROR 36 ; 37 ; PERFORM FOLLOWING FUNCTIONS 38 ; BOOT COLD START 39 ; WBOOT WARM START (SAVE I/O BYTE) 40 ; (BOOT AND WBOOT ARE THE SAME FOR MDS) 41 ; CONST CONSOLE STATUS 42 ; REG-A = 00 IF NO CHARACTER READY 43 ; REG-A = FF IF CHARACTER READY 44 ; CONIN CONSOLE CHARACTER IN (RESULT IN REG-A) 45 ; CONOUT CONSOLE CHARACTER OUT (CHAR IN REG-C) 46 ; LIST LIST OUT (CHAR IN REG-C) 47 ; PUNCH PUNCH OUT (CHAR IN REG-C) 48 ; READER PAPER TAPE READER IN (RESULT TO REG-A) 49 ; HOME MOVE TO TRACK 00 50 ; 51 ; (THE FOLLOWING CALLS SET-UP THE IO PARAMETER BLOCK FOR THE 52 ; MDS, WHICH IS USED TO PERFORM SUBSEQUENT READS AND WRITES) 53 ; SELDSK SELECT DISK GIVEN BY REG-C (0,1,2...) 54 ; SETTRK SET TRACK ADDRESS (0,...76) FOR SUBSEQUENT READ/WRITE 55 ; SETSEC SET SECTOR ADDRESS (1,...,26) FOR SUBSEQUENT READ/WRITE 56 ; SETDMA SET SUBSEQUENT DMA ADDRESS (INITIALLY 80H) 57 ; 58 ; (READ AND WRITE ASSUME PREVIOUS CALLS TO SET UP THE IO PARAMETERS) 59 ; READ READ TRACK/SECTOR TO PRESET DMA ADDRESS 60 ; WRITE WRITE TRACK/SECTOR FROM PRESET DMA ADDRESS 61 ; 62 ; JUMP VECTOR FOR INDIVIUAL ROUTINES 63 1600 C3B316 JMP BOOT 64 1603 C3C316 WBOOTE: JMP WBOOT 65 1606 C36117 JMP CONST 66 1609 C36417 JMP CONIN 67 160C C36A17 JMP CONOUT 68 160F C36D17 JMP LIST 69 1612 C37217 JMP PUNCH 70 1615 C37517 JMP READER 71 1618 C37817 JMP HOME 72 161B C37D17 JMP SELDSK 73 161E C3A717 JMP SETTRK 74 1621 C3AC17 JMP SETSEC 75 1624 C3BB17 JMP SETDMA 76 1627 C3C117 JMP READ 77 162A C3CA17 JMP WRITE 78 162D C37017 JMP LISTST ;LIST STATUS 79 1630 C3B117 JMP SECTRAN 80 ; 81 MACLIB DISKDEF ;LOAD THE DISK DEFINITION LIBRARY 82 DISKS 4 ;FOUR DISKS 83 1633+= DPBASE EQU $ ;BASE OF DISK PARAMETER BLOCKS 84 1633+82160000 DPE0: DW XLT0,0000H ;TRANSLATE TABLE 85 1637+00000000 DW 0000H,0000H ;SCRATCH AREA 86 163B+6E187316 DW DIRBUF,DPB0 ;DIR BUFF,PARM BLOCK 87 163F+0D19EE18 DW CSV0,ALV0 ;CHECK, ALLOC VECTORS 88 1643+82160000 DPE1: DW XLT1,0000H ;TRANSLATE TABLE 89 1647+00000000 DW 0000H,0000H ;SCRATCH AREA 90 164B+6E187316 DW DIRBUF,DPB1 ;DIR BUFF,PARM BLOCK 91 164F+3C191D19 DW CSV1,ALV1 ;CHECK, ALLOC VECTORS 92 1653+82160000 DPE2: DW XLT2,0000H ;TRANSLATE TABLE 93 1657+00000000 DW 0000H,0000H ;SCRATCH AREA 94 165B+6E187316 DW DIRBUF,DPB2 ;DIR BUFF,PARM BLOCK 95 165F+6B194C19 DW CSV2,ALV2 ;CHECK, ALLOC VECTORS 96 1663+82160000 DPE3: DW XLT3,0000H ;TRANSLATE TABLE 97 1667+00000000 DW 0000H,0000H ;SCRATCH AREA 98 166B+6E187316 DW DIRBUF,DPB3 ;DIR BUFF,PARM BLOCK 99 166F+9A197B19 DW CSV3,ALV3 ;CHECK, ALLOC VECTORS 100 DISKDEF 0,1,26,6,1024,243,64,64,OFFSET 101 1673+= DPB0 EQU $ ;DISK PARM BLOCK 102 1673+1A00 DW 26 ;SEC PER TRACK 103 1675+03 DB 3 ;BLOCK SHIFT 104 1676+07 DB 7 ;BLOCK MASK 105 1677+00 DB 0 ;EXTNT MASK 106 1678+F200 DW 242 ;DISK SIZE-1 107 167A+3F00 DW 63 ;DIRECTORY MAX 108 167C+C0 DB 192 ;ALLOC0 109 167D+00 DB 0 ;ALLOC1 110 167E+1000 DW 16 ;CHECK SIZE 111 1680+0200 DW 2 ;OFFSET 112 1682+= XLT0 EQU $ ;TRANSLATE TABLE 113 1682+01 DB 1 114 1683+07 DB 7 115 1684+0D DB 13 116 1685+13 DB 19 117 1686+19 DB 25 118 1687+05 DB 5 119 1688+0B DB 11 120 1689+11 DB 17 121 168A+17 DB 23 122 168B+03 DB 3 123 168C+09 DB 9 124 168D+0F DB 15 125 168E+15 DB 21 126 168F+02 DB 2 127 1690+08 DB 8 128 1691+0E DB 14 129 1692+14 DB 20 130 1693+1A DB 26 131 1694+06 DB 6 132 1695+0C DB 12 133 1696+12 DB 18 134 1697+18 DB 24 135 1698+04 DB 4 136 1699+0A DB 10 137 169A+10 DB 16 138 169B+16 DB 22 139 DISKDEF 1,0 140 1673+= DPB1 EQU DPB0 ;EQUIVALENT PARAMETERS 141 001F+= ALS1 EQU ALS0 ;SAME ALLOCATION VECTOR SIZE 142 0010+= CSS1 EQU CSS0 ;SAME CHECKSUM VECTOR SIZE 143 1682+= XLT1 EQU XLT0 ;SAME TRANSLATE TABLE 144 DISKDEF 2,0 145 1673+= DPB2 EQU DPB0 ;EQUIVALENT PARAMETERS 146 001F+= ALS2 EQU ALS0 ;SAME ALLOCATION VECTOR SIZE 147 0010+= CSS2 EQU CSS0 ;SAME CHECKSUM VECTOR SIZE 148 1682+= XLT2 EQU XLT0 ;SAME TRANSLATE TABLE 149 DISKDEF 3,0 150 1673+= DPB3 EQU DPB0 ;EQUIVALENT PARAMETERS 151 001F+= ALS3 EQU ALS0 ;SAME ALLOCATION VECTOR SIZE 152 0010+= CSS3 EQU CSS0 ;SAME CHECKSUM VECTOR SIZE 153 1682+= XLT3 EQU XLT0 ;SAME TRANSLATE TABLE 154 ; ENDEF OCCURS AT END OF ASSEMBLY 155 ; 156 ; END OF CONTROLLER - INDEPENDENT CODE, THE REMAINING SUBROUTINES 157 ; ARE TAILORED TO THE PARTICULAR OPERATING ENVIRONMENT, AND MUST 158 ; BE ALTERED FOR ANY SYSTEM WHICH DIFFERS FROM THE INTEL MDS. 159 ; 160 ; THE FOLLOWING CODE ASSUMES THE MDS MONITOR EXISTS AT 0F800H 161 ; AND USES THE I/O SUBROUTINES WITHIN THE MONITOR 162 ; 163 ; WE ALSO ASSUME THE MDS SYSTEM HAS FOUR DISK DRIVES 164 00FD = REVRT EQU 0FDH ;INTERRUPT REVERT PORT 165 00FC = INTC EQU 0FCH ;INTERRUPT MASK PORT 166 00F3 = ICON EQU 0F3H ;INTERRUPT CONTROL PORT 167 007E = INTE EQU 0111$1110B ;ENABLE RST 0(WARM BOOT), RST 7 (MONITOR) 168 ; 169 ; MDS MONITOR EQUATES 170 F800 = MON80 EQU 0F800H ;MDS MONITOR 171 FF0F = RMON80 EQU 0FF0FH ;RESTART MON80 (BOOT ERROR) 172 F803 = CI EQU 0F803H ;CONSOLE CHARACTER TO REG-A 173 F806 = RI EQU 0F806H ;READER IN TO REG-A 174 F809 = CO EQU 0F809H ;CONSOLE CHAR FROM C TO CONSOLE OUT 175 F80C = PO EQU 0F80CH ;PUNCH CHAR FROM C TO PUNCH DEVICE 176 F80F = LO EQU 0F80FH ;LIST FROM C TO LIST DEVICE 177 F812 = CSTS EQU 0F812H ;CONSOLE STATUS 00/FF TO REGISTER A 178 ; 179 ; DISK PORTS AND COMMANDS 180 0078 = BASE EQU 78H ;BASE OF DISK COMMAND IO PORTS 181 0078 = DSTAT EQU BASE ;DISK STATUS (INPUT) 182 0079 = RTYPE EQU BASE+1 ;RESULT TYPE (INPUT) 183 007B = RBYTE EQU BASE+3 ;RESULT BYTE (INPUT) 184 ; 185 0079 = ILOW EQU BASE+1 ;IOPB LOW ADDRESS (OUTPUT) 186 007A = IHIGH EQU BASE+2 ;IOPB HIGH ADDRESS (OUTPUT) 187 ; 188 0004 = READF EQU 4H ;READ FUNCTION 189 0006 = WRITF EQU 6H ;WRITE FUNCTION 190 0003 = RECAL EQU 3H ;RECALIBRATE DRIVE 191 0004 = IORDY EQU 4H ;I/O FINISHED MASK 192 000D = CR EQU 0DH ;CARRIAGE RETURN 193 000A = LF EQU 0AH ;LINE FEED 194 ; 195 SIGNON: ;SIGNON MESSAGE: XXK CP/M VERS Y.Y 196 169C 0D0A0A DB CR,LF,LF 197 IF TEST 198 DB '32' ;32K EXAMPLE BIOS 199 ENDIF 200 IF NOT TEST 201 169F 3030 DB '00' ;MEMORY SIZE FILLED BY RELOCATOR 202 ENDIF 203 16A1 6B2043502F DB 'k CP/M vers ' 204 16AD 322E32 DB VERS/10+'0','.',VERS MOD 10+'0' 205 16B0 0D0A00 DB CR,LF,0 206 ; 207 BOOT: ;PRINT SIGNON MESSAGE AND GO TO CCP 208 ; (NOTE: MDS BOOT INITIALIZED IOBYTE AT 0003H) 209 16B3 310001 LXI SP,BUFF+80H 210 16B6 219C16 LXI H,SIGNON 211 16B9 CDD317 CALL PRMSG ;PRINT MESSAGE 212 16BC AF XRA A ;CLEAR ACCUMULATOR 213 16BD 320400 STA CDISK ;SET INITIALLY TO DISK A 214 16C0 C30F17 JMP GOCPM ;GO TO CP/M 215 ; 216 ; 217 WBOOT:; LOADER ON TRACK 0, SECTOR 1, WHICH WILL BE SKIPPED FOR WARM 218 ; READ CP/M FROM DISK - ASSUMING THERE IS A 128 BYTE COLD START 219 ; START. 220 ; 221 16C3 318000 LXI SP,BUFF ;USING DMA - THUS 80 THRU FF AVAILABLE FOR STACK 222 ; 223 16C6 0E0A MVI C,RETRY ;MAX RETRIES 224 16C8 C5 PUSH B 225 WBOOT0: ;ENTER HERE ON ERROR RETRIES 226 16C9 010000 LXI B,CPMB ;SET DMA ADDRESS TO START OF DISK SYSTEM 227 16CC CDBB17 CALL SETDMA 228 16CF 0E00 MVI C,0 ;BOOT FROM DRIVE 0 229 16D1 CD7D17 CALL SELDSK 230 16D4 0E00 MVI C,0 231 16D6 CDA717 CALL SETTRK ;START WITH TRACK 0 232 16D9 0E02 MVI C,2 ;START READING SECTOR 2 233 16DB CDAC17 CALL SETSEC 234 ; 235 ; READ SECTORS, COUNT NSECTS TO ZERO 236 16DE C1 POP B ;10-ERROR COUNT 237 16DF 062C MVI B,NSECTS 238 RDSEC: ;READ NEXT SECTOR 239 16E1 C5 PUSH B ;SAVE SECTOR COUNT 240 16E2 CDC117 CALL READ 241 16E5 C24917 JNZ BOOTERR ;RETRY IF ERRORS OCCUR 242 16E8 2A6C18 LHLD IOD ;INCREMENT DMA ADDRESS 243 16EB 118000 LXI D,128 ;SECTOR SIZE 244 16EE 19 DAD D ;INCREMENTED DMA ADDRESS IN HL 245 16EF 44 MOV B,H 246 16F0 4D MOV C,L ;READY FOR CALL TO SET DMA 247 16F1 CDBB17 CALL SETDMA 248 16F4 3A6B18 LDA IOS ;SECTOR NUMBER JUST READ 249 16F7 FE1A CPI 26 ;READ LAST SECTOR? 250 16F9 DA0517 JC RD1 251 ; MUST BE SECTOR 26, ZERO AND GO TO NEXT TRACK 252 16FC 3A6A18 LDA IOT ;GET TRACK TO REGISTER A 253 16FF 3C INR A 254 1700 4F MOV C,A ;READY FOR CALL 255 1701 CDA717 CALL SETTRK 256 1704 AF XRA A ;CLEAR SECTOR NUMBER 257 1705 3C RD1: INR A ;TO NEXT SECTOR 258 1706 4F MOV C,A ;READY FOR CALL 259 1707 CDAC17 CALL SETSEC 260 170A C1 POP B ;RECALL SECTOR COUNT 261 170B 05 DCR B ;DONE? 262 170C C2E116 JNZ RDSEC 263 ; 264 ; DONE WITH THE LOAD, RESET DEFAULT BUFFER ADDRESS 265 GOCPM: ;(ENTER HERE FROM COLD START BOOT) 266 ; ENABLE RST0 AND RST7 267 170F F3 DI 268 1710 3E12 MVI A,12H ;INITIALIZE COMMAND 269 1712 D3FD OUT REVRT 270 1714 AF XRA A 271 1715 D3FC OUT INTC ;CLEARED 272 1717 3E7E MVI A,INTE ;RST0 AND RST7 BITS ON 273 1719 D3FC OUT INTC 274 171B AF XRA A 275 171C D3F3 OUT ICON ;INTERRUPT CONTROL 276 ; 277 ; SET DEFAULT BUFFER ADDRESS TO 80H 278 171E 018000 LXI B,BUFF 279 1721 CDBB17 CALL SETDMA 280 ; 281 ; RESET MONITOR ENTRY POINTS 282 1724 3EC3 MVI A,JMP 283 1726 320000 STA 0 284 1729 210316 LXI H,WBOOTE 285 172C 220100 SHLD 1 ;JMP WBOOT AT LOCATION 00 286 172F 320500 STA 5 287 1732 210608 LXI H,BDOS 288 1735 220600 SHLD 6 ;JMP BDOS AT LOCATION 5 289 IF NOT TEST 290 1738 323800 STA 7*8 ;JMP TO MON80 (MAY HAVE BEEN CHANGED BY DDT) 291 173B 2100F8 LXI H,MON80 292 173E 223900 SHLD 7*8+1 293 ENDIF 294 ; LEAVE IOBYTE SET 295 ; PREVIOUSLY SELECTED DISK WAS B, SEND PARAMETER TO CPM 296 1741 3A0400 LDA CDISK ;LAST LOGGED DISK NUMBER 297 1744 4F MOV C,A ;SEND TO CCP TO LOG IT IN 298 1745 FB EI 299 1746 C30000 JMP CPMB 300 ; 301 ; ERROR CONDITION OCCURRED, PRINT MESSAGE AND RETRY 302 BOOTERR: 303 1749 C1 POP B ;RECALL COUNTS 304 174A 0D DCR C 305 174B CA5217 JZ BOOTER0 306 ; TRY AGAIN 307 174E C5 PUSH B 308 174F C3C916 JMP WBOOT0 309 ; 310 BOOTER0: 311 ; OTHERWISE TOO MANY RETRIES 312 1752 215B17 LXI H,BOOTMSG 313 1755 CDD317 CALL PRMSG 314 1758 C30FFF JMP RMON80 ;MDS HARDWARE MONITOR 315 ; 316 BOOTMSG: 317 175B 3F626F6F74 DB '?boot',0 318 ; 319 ; 320 CONST: ;CONSOLE STATUS TO REG-A 321 ; (EXACTLY THE SAME AS MDS CALL) 322 1761 C312F8 JMP CSTS 323 ; 324 CONIN: ;CONSOLE CHARACTER TO REG-A 325 1764 CD03F8 CALL CI 326 1767 E67F ANI 7FH ;REMOVE PARITY BIT 327 1769 C9 RET 328 ; 329 CONOUT: ;CONSOLE CHARACTER FROM C TO CONSOLE OUT 330 176A C309F8 JMP CO 331 ; 332 LIST: ;LIST DEVICE OUT 333 ; (EXACTLY THE SAME AS MDS CALL) 334 176D C30FF8 JMP LO 335 ; 336 LISTST: 337 ;RETURN LIST STATUS 338 1770 AF XRA A 339 1771 C9 RET ;ALWAYS NOT READY 340 ; 341 PUNCH: ;PUNCH DEVICE OUT 342 ; (EXACTLY THE SAME AS MDS CALL) 343 1772 C30CF8 JMP PO 344 ; 345 READER: ;READER CHARACTER IN TO REG-A 346 ; (EXACTLY THE SAME AS MDS CALL) 347 1775 C306F8 JMP RI 348 ; 349 HOME: ;MOVE TO HOME POSITION 350 ; TREAT AS TRACK 00 SEEK 351 1778 0E00 MVI C,0 352 177A C3A717 JMP SETTRK 353 ; 354 SELDSK: ;SELECT DISK GIVEN BY REGISTER C 355 177D 210000 LXI H,0000H ;RETURN 0000 IF ERROR 356 1780 79 MOV A,C 357 1781 FE04 CPI NDISKS ;TOO LARGE? 358 1783 D0 RNC ;LEAVE HL = 0000 359 ; 360 1784 E602 ANI 10B ;00 00 FOR DRIVE 0,1 AND 10 10 FOR DRIVE 2,3 361 1786 326618 STA DBANK ;TO SELECT DRIVE BANK 362 1789 79 MOV A,C ;00, 01, 10, 11 363 178A E601 ANI 1B ;MDS HAS 0,1 AT 78, 2,3 AT 88 364 178C B7 ORA A ;RESULT 00? 365 178D CA9217 JZ SETDRIVE 366 1790 3E30 MVI A,00110000B ;SELECTS DRIVE 1 IN BANK 367 SETDRIVE: 368 1792 47 MOV B,A ;SAVE THE FUNCTION 369 1793 216818 LXI H,IOF ;IO FUNCTION 370 1796 7E MOV A,M 371 1797 E6CF ANI 11001111B ;MASK OUT DISK NUMBER 372 1799 B0 ORA B ;MASK IN NEW DISK NUMBER 373 179A 77 MOV M,A ;SAVE IT IN IOPB 374 179B 69 MOV L,C 375 179C 2600 MVI H,0 ;HL=DISK NUMBER 376 179E 29 DAD H ;*2 377 179F 29 DAD H ;*4 378 17A0 29 DAD H ;*8 379 17A1 29 DAD H ;*16 380 17A2 113316 LXI D,DPBASE 381 17A5 19 DAD D ;HL=DISK HEADER TABLE ADDRESS 382 17A6 C9 RET 383 ; 384 ; 385 SETTRK: ;SET TRACK ADDRESS GIVEN BY C 386 17A7 216A18 LXI H,IOT 387 17AA 71 MOV M,C 388 17AB C9 RET 389 ; 390 SETSEC: ;SET SECTOR NUMBER GIVEN BY C 391 17AC 216B18 LXI H,IOS 392 17AF 71 MOV M,C 393 17B0 C9 RET 394 SECTRAN: 395 ;TRANSLATE SECTOR BC USING TABLE AT DE 396 17B1 0600 MVI B,0 ;DOUBLE PRECISION SECTOR NUMBER IN BC 397 17B3 EB XCHG ;TRANSLATE TABLE ADDRESS TO HL 398 17B4 09 DAD B ;TRANSLATE(SECTOR) ADDRESS 399 17B5 7E MOV A,M ;TRANSLATED SECTOR NUMBER TO A 400 17B6 326B18 STA IOS 401 17B9 6F MOV L,A ;RETURN SECTOR NUMBER IN L 402 17BA C9 RET 403 ; 404 SETDMA: ;SET DMA ADDRESS GIVEN BY REGS B,C 405 17BB 69 MOV L,C 406 17BC 60 MOV H,B 407 17BD 226C18 SHLD IOD 408 17C0 C9 RET 409 ; 410 READ: ;READ NEXT DISK RECORD (ASSUMING DISK/TRK/SEC/DMA SET) 411 17C1 0E04 MVI C,READF ;SET TO READ FUNCTION 412 17C3 CDE017 CALL SETFUNC 413 17C6 CDF017 CALL WAITIO ;PERFORM READ FUNCTION 414 17C9 C9 RET ;MAY HAVE ERROR SET IN REG-A 415 ; 416 ; 417 WRITE: ;DISK WRITE FUNCTION 418 17CA 0E06 MVI C,WRITF 419 17CC CDE017 CALL SETFUNC ;SET TO WRITE FUNCTION 420 17CF CDF017 CALL WAITIO 421 17D2 C9 RET ;MAY HAVE ERROR SET 422 ; 423 ; 424 ; UTILITY SUBROUTINES 425 PRMSG: ;PRINT MESSAGE AT H,L TO 0 426 17D3 7E MOV A,M 427 17D4 B7 ORA A ;ZERO? 428 17D5 C8 RZ 429 ; MORE TO PRINT 430 17D6 E5 PUSH H 431 17D7 4F MOV C,A 432 17D8 CD6A17 CALL CONOUT 433 17DB E1 POP H 434 17DC 23 INX H 435 17DD C3D317 JMP PRMSG 436 ; 437 SETFUNC: 438 ; SET FUNCTION FOR NEXT I/O (COMMAND IN REG-C) 439 17E0 216818 LXI H,IOF ;IO FUNCTION ADDRESS 440 17E3 7E MOV A,M ;GET IT TO ACCUMULATOR FOR MASKING 441 17E4 E6F8 ANI 11111000B ;REMOVE PREVIOUS COMMAND 442 17E6 B1 ORA C ;SET TO NEW COMMAND 443 17E7 77 MOV M,A ;REPLACED IN IOPB 444 ; THE MDS-800 CONTROLLER REQUIRES DISK BANK BIT IN SECTOR BYTE 445 ; MASK THE BIT FROM THE CURRENT I/O FUNCTION 446 17E8 E620 ANI 00100000B ;MASK THE DISK SELECT BIT 447 17EA 216B18 LXI H,IOS ;ADDRESS THE SECTOR SELECT BYTE 448 17ED B6 ORA M ;SELECT PROPER DISK BANK 449 17EE 77 MOV M,A ;SET DISK SELECT BIT ON/OFF 450 17EF C9 RET 451 ; 452 WAITIO: 453 17F0 0E0A MVI C,RETRY ;MAX RETRIES BEFORE PERM ERROR 454 REWAIT: 455 ; START THE I/O FUNCTION AND WAIT FOR COMPLETION 456 17F2 CD3F18 CALL INTYPE ;IN RTYPE 457 17F5 CD4C18 CALL INBYTE ;CLEARS THE CONTROLLER 458 ; 459 17F8 3A6618 LDA DBANK ;SET BANK FLAGS 460 17FB B7 ORA A ;ZERO IF DRIVE 0,1 AND NZ IF 2,3 461 17FC 3E67 MVI A,IOPB AND 0FFH ;LOW ADDRESS FOR IOPB 462 17FE 0618 MVI B,IOPB SHR 8 ;HIGH ADDRESS FOR IOPB 463 1800 C20B18 JNZ IODR1 ;DRIVE BANK 1? 464 1803 D379 OUT ILOW ;LOW ADDRESS TO CONTROLLER 465 1805 78 MOV A,B 466 1806 D37A OUT IHIGH ;HIGH ADDRESS 467 1808 C31018 JMP WAIT0 ;TO WAIT FOR COMPLETE 468 ; 469 IODR1: ;DRIVE BANK 1 470 180B D389 OUT ILOW+10H ;88 FOR DRIVE BANK 10 471 180D 78 MOV A,B 472 180E D38A OUT IHIGH+10H 473 ; 474 1810 CD5918 WAIT0: CALL INSTAT ;WAIT FOR COMPLETION 475 1813 E604 ANI IORDY ;READY? 476 1815 CA1018 JZ WAIT0 477 ; 478 ; CHECK IO COMPLETION OK 479 1818 CD3F18 CALL INTYPE ;MUST BE IO COMPLETE (00) UNLINKED 480 ; 00 UNLINKED I/O COMPLETE, 01 LINKED I/O COMPLETE (NOT USED) 481 ; 10 DISK STATUS CHANGED 11 (NOT USED) 482 181B FE02 CPI 10B ;READY STATUS CHANGE? 483 181D CA3218 JZ WREADY 484 ; 485 ; MUST BE 00 IN THE ACCUMULATOR 486 1820 B7 ORA A 487 1821 C23818 JNZ WERROR ;SOME OTHER CONDITION, RETRY 488 ; 489 ; CHECK I/O ERROR BITS 490 1824 CD4C18 CALL INBYTE 491 1827 17 RAL 492 1828 DA3218 JC WREADY ;UNIT NOT READY 493 182B 1F RAR 494 182C E6FE ANI 11111110B ;ANY OTHER ERRORS? (DELETED DATA OK) 495 182E C23818 JNZ WERROR 496 ; 497 ; READ OR WRITE IS OK, ACCUMULATOR CONTAINS ZERO 498 1831 C9 RET 499 ; 500 WREADY: ;NOT READY, TREAT AS ERROR FOR NOW 501 1832 CD4C18 CALL INBYTE ;CLEAR RESULT BYTE 502 1835 C33818 JMP TRYCOUNT 503 ; 504 WERROR: ;RETURN HARDWARE MALFUNCTION (CRC, TRACK, SEEK, ETC.) 505 ; THE MDS CONTROLLER HAS RETURNED A BIT IN EACH POSITION 506 ; OF THE ACCUMULATOR, CORRESPONDING TO THE CONDITIONS: 507 ; 0 - DELETED DATA (ACCEPTED AS OK ABOVE) 508 ; 1 - CRC ERROR 509 ; 2 - SEEK ERROR 510 ; 3 - ADDRESS ERROR (HARDWARE MALFUNCTION) 511 ; 4 - DATA OVER/UNDER FLOW (HARDWARE MALFUNCTION) 512 ; 5 - WRITE PROTECT (TREATED AS NOT READY) 513 ; 6 - WRITE ERROR (HARDWARE MALFUNCTION) 514 ; 7 - NOT READY 515 ; (ACCUMULATOR BITS ARE NUMBERED 7 6 5 4 3 2 1 0) 516 ; 517 ; IT MAY BE USEFUL TO FILTER OUT THE VARIOUS CONDITIONS, 518 ; BUT WE WILL GET A PERMANENT ERROR MESSAGE IF IT IS NOT 519 ; RECOVERABLE. IN ANY CASE, THE NOT READY CONDITION IS 520 ; TREATED AS A SEPARATE CONDITION FOR LATER IMPROVEMENT 521 TRYCOUNT: 522 ; REGISTER C CONTAINS RETRY COUNT, DECREMENT 'TIL ZERO 523 1838 0D DCR C 524 1839 C2F217 JNZ REWAIT ;FOR ANOTHER TRY 525 ; 526 ; CANNOT RECOVER FROM ERROR 527 183C 3E01 MVI A,1 ;ERROR CODE 528 183E C9 RET 529 ; 530 ; INTYPE, INBYTE, INSTAT READ DRIVE BANK 00 OR 10 531 183F 3A6618 INTYPE: LDA DBANK 532 1842 B7 ORA A 533 1843 C24918 JNZ INTYP1 ;SKIP TO BANK 10 534 1846 DB79 IN RTYPE 535 1848 C9 RET 536 1849 DB89 INTYP1: IN RTYPE+10H ;78 FOR 0,1 88 FOR 2,3 537 184B C9 RET 538 ; 539 184C 3A6618 INBYTE: LDA DBANK 540 184F B7 ORA A 541 1850 C25618 JNZ INBYT1 542 1853 DB7B IN RBYTE 543 1855 C9 RET 544 1856 DB8B INBYT1: IN RBYTE+10H 545 1858 C9 RET 546 ; 547 1859 3A6618 INSTAT: LDA DBANK 548 185C B7 ORA A 549 185D C26318 JNZ INSTA1 550 1860 DB78 IN DSTAT 551 1862 C9 RET 552 1863 DB88 INSTA1: IN DSTAT+10H 553 1865 C9 RET 554 ; 555 ; 556 ; 557 ; DATA AREAS (MUST BE IN RAM) 558 1866 00 DBANK: DB 0 ;DISK BANK 00 IF DRIVE 0,1 559 ; 10 IF DRIVE 2,3 560 IOPB: ;IO PARAMETER BLOCK 561 1867 80 DB 80H ;NORMAL I/O OPERATION 562 1868 04 IOF: DB READF ;IO FUNCTION, INITIAL READ 563 1869 01 ION: DB 1 ;NUMBER OF SECTORS TO READ 564 186A 02 IOT: DB OFFSET ;TRACK NUMBER 565 186B 01 IOS: DB 1 ;SECTOR NUMBER 566 186C 8000 IOD: DW BUFF ;IO ADDRESS 567 ; 568 ; 569 ; DEFINE RAM AREAS FOR BDOS OPERATION 570 ENDEF 571 186E+= BEGDAT EQU $ 572 186E+ DIRBUF: DS 128 ;DIRECTORY ACCESS BUFFER 573 18EE+ ALV0: DS 31 574 190D+ CSV0: DS 16 575 191D+ ALV1: DS 31 576 193C+ CSV1: DS 16 577 194C+ ALV2: DS 31 578 196B+ CSV2: DS 16 579 197B+ ALV3: DS 31 580 199A+ CSV3: DS 16 581 19AA+= ENDDAT EQU $ 582 013C+= DATSIZ EQU $-BEGDAT 583 19AA END ALS1 001F 141# ALS2 001F 146# ALS3 001F 151# ALV0 18EE 87 573# ALV1 191D 91 575# ALV2 194C 95 577# ALV3 197B 99 579# BASE 0078 180# 181 182 183 185 186 BDOS 0806 29# 287 BEGDAT 186E 571# 582 BIAS 0000 19# 22# BOOT 16B3 63 207# BOOTER0 1752 305 310# BOOTERR 1749 241 302# BOOTMSG 175B 312 316# BUFF 0080 34# 209 221 278 566 CDISK 0004 33# 213 296 CI F803 172# 325 CO F809 174# 330 CONIN 1764 66 324# CONOUT 176A 67 329# 432 CONST 1761 65 320# CPMB 0000 28# 29 30 226 299 CPML 1600 30# 31 CR 000D 192# 196 205 CSS1 0010 142# CSS2 0010 147# CSS3 0010 152# CSTS F812 177# 322 CSV0 190D 87 574# CSV1 193C 91 576# CSV2 196B 95 578# CSV3 199A 99 580# DATSIZ 013C 582# DBANK 1866 361 459 531 539 547 558# DIRBUF 186E 86 90 94 98 572# DPB0 1673 86 101# 140 145 150 DPB1 1673 90 140# DPB2 1673 94 145# DPB3 1673 98 150# DPBASE 1633 83# 380 DPE0 1633 84# DPE1 1643 88# DPE2 1653 92# DPE3 1663 96# DSTAT 0078 181# 550 552 ENDDAT 19AA 581# FALSE 0000 15# 16 GOCPM 170F 214 265# HOME 1778 71 349# ICON 00F3 166# 275 IHIGH 007A 186# 466 472 ILOW 0079 185# 464 470 INBYT1 1856 541 544# INBYTE 184C 457 490 501 539# INSTA1 1863 549 552# INSTAT 1859 474 547# INTC 00FC 165# 271 273 INTE 007E 167# 272 INTYP1 1849 533 536# INTYPE 183F 456 479 531# IOD 186C 242 407 566# IODR1 180B 463 469# IOF 1868 369 439 562# ION 1869 563# IOPB 1867 461 462 560# IORDY 0004 191# 475 IOS 186B 248 391 400 447 565# IOT 186A 252 386 564# LF 000A 193# 196 196 205 LIST 176D 68 332# LISTST 1770 78 336# LO F80F 176# 334 MON80 F800 170# 291 NSECTS 002C 31# 237 OFFSET 0002 32# 100 564 PATCH 1600 25# 27 28 PO F80C 175# 343 PRMSG 17D3 211 313 425# 435 PUNCH 1772 69 341# RBYTE 007B 183# 542 544 RD1 1705 250 257# RDSEC 16E1 238# 262 READ 17C1 76 240 410# READER 1775 70 345# READF 0004 188# 411 562 RECAL 0003 190# RETRY 000A 35# 223 453 REVRT 00FD 164# 269 REWAIT 17F2 454# 524 RI F806 173# 347 RMON80 FF0F 171# 314 RTYPE 0079 182# 534 536 SECTRAN 17B1 79 394# SELDSK 177D 72 229 354# SETDMA 17BB 75 227 247 279 404# SETDRIVE 1792 365 367# SETFUNC 17E0 412 419 437# SETSEC 17AC 74 233 259 390# SETTRK 17A7 73 231 255 352 385# SIGNON 169C 195# 210 TEST 0000 16# 18 21 197 200 289 TRUE FFFF 14# 15 TRYCOUNT 1838 502 521# VERS 0016 6# 204 204 WAIT0 1810 467 474# 476 WAITIO 17F0 413 420 452# WBOOT 16C3 64 217# WBOOT0 16C9 225# 308 WBOOTE 1603 64# 284 WERROR 1838 487 495 504# WREADY 1832 483 492 500# WRITE 17CA 77 417# WRITF 0006 189# 418 XLT0 1682 84 112# 143 148 153 XLT1 1682 88 143# XLT2 1682 92 148# XLT3 1682 96 153#